package org.hq.service.sql;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.hq.pojo.GroupsVideo;
import org.hq.pojo.HostWeb;
import org.hq.pojo.VideoMessage;
import org.hq.pojo.WebName;
import org.hq.pojo.select.VideoSelect;
import org.hq.service.sql.impl.GroupsVideoServiceImpl;
import org.hq.service.sql.impl.HostWebServiceImpl;
import org.hq.service.sql.impl.VideoMessageServiceImpl;
import org.hq.service.sql.impl.WebNameServiceImpl;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;

/**
 * 数据库管理服务
 */
@Service
public class MysqlManageService {
    //标签类型
    public static final int AGETYPE_WEB = 0;//表示添加是主标签
    public static final int AGETYPE_ITEM = 1;//表示添加是子标签标签


    @Autowired
    private WebNameServiceImpl wns;
    @Autowired
    private HostWebServiceImpl hws;
    @Autowired
    private GroupsVideoServiceImpl gvs;
    @Autowired
    //数据库视频信息记录表管理服务
    private VideoMessageServiceImpl vmsp;

    /**
     * 网站添加
     *
     * @param webname 网站昵称
     * @return 成功 true 失败 false
     */
    public boolean addWebName(String webname) {
        //判断数据是否存在
        LambdaQueryWrapper<WebName> wrapper = new LambdaQueryWrapper();
        wrapper.eq(WebName::getName, webname);
        WebName one = wns.getOne(wrapper);
        if (one == null)
            return wns.save(new WebName(webname));
        return false;
    }

    /**
     * 网址添加
     *
     * @param webname 网站昵称
     * @param hostWeb
     * @return 成功 true 失败 false
     */
    public boolean addHostWeb(String webname, HostWeb hostWeb) {
        //判断数据是否存在
        LambdaQueryWrapper<WebName> wrapper = new LambdaQueryWrapper();
        wrapper.eq(WebName::getName, webname);
        WebName one = wns.getOne(wrapper);
        if (one == null) return false;
        hostWeb.setWebId(one.getId());
        hostWeb.setTimp(LocalDate.now());
        return hws.save(hostWeb);
    }

    /**
     * 分组标签添加
     *
     * @param tagName
     * @param groupsVideo
     * @param tagType     标签类型
     * @return 成功 true 失败 false
     */
    public boolean saveGroupsVideo(String tagName, @NotNull GroupsVideo groupsVideo, int tagType) {
        //添加时间
        groupsVideo.setTimp(LocalDate.now());
        //主标签
        if (tagType == AGETYPE_WEB) {
            //判断网站分组是否存在
            LambdaQueryWrapper<WebName> wrapper = new LambdaQueryWrapper();
            wrapper.eq(WebName::getName, tagName);
            WebName webobj = wns.getOne(wrapper);
            if (webobj == null) return false;

            //判断标签是否存在如果存在直接返回
            LambdaQueryWrapper<GroupsVideo> gvw = new LambdaQueryWrapper();
            gvw.eq(GroupsVideo::getName, groupsVideo.getName());
            gvw.eq(GroupsVideo::getWebId, webobj.getId());
            if (gvs.getOne(gvw) != null) return false;

            groupsVideo.setWebId(webobj.getId());
            //更新 pid值
            if (gvs.save(groupsVideo)) {
                groupsVideo.setPid(gvs.getOne(gvw).getId());
                gvs.update(groupsVideo, gvw);
                return true;
            }
            return false;

        }
        //添加子标签
        if (tagType == AGETYPE_ITEM) {
            //判断标签主是否存在如果不存在直接
            LambdaQueryWrapper<GroupsVideo> gvw = new LambdaQueryWrapper();
            gvw.eq(GroupsVideo::getName, tagName);
            GroupsVideo one = gvs.getOne(gvw);
            if (one == null) return false;
            //判断子标签是否存在 存在就直接返回
            gvw.eq(GroupsVideo::getName, groupsVideo.getName());
            //判断子标签是否存在如果存在直接返回
            gvw.eq(GroupsVideo::getPid, one.getId());
            if (gvs.getOne(gvw) != null) return false;
            //设置 网站 id
            groupsVideo.setWebId(one.getWebId());
            // 设置子标签关联 主标签 id
            groupsVideo.setPid(one.getId());

            //保存标签
            return gvs.save(groupsVideo);


        }

        return false;
    }

    /**
     * 保存一条视频数据信息
     * @param en 数据对象
     * @return  成功 true 失败 false
     */
    public final boolean saveVideoMessage(VideoMessage en){
        if (en == null) return false;
        return this.vmsp.save(en);
    }
    public final boolean saveVideoMessage(List<VideoMessage> en){
        if (en == null) return false;
        return this.vmsp.saveBatch(en);

    }
    /**
     * 获取所以网站
     * @return 网站集合
     */
    public List<WebName> getLisetWebName() {
        return wns.list();
    }

    /**
     * 通过网站 id 获取最新网址
     * @param webName
     * @return
     */
    public HostWeb getLimitHostWeb(WebName webName) {

        // 创建查询条件对象
        LambdaQueryWrapper<HostWeb> qw = new LambdaQueryWrapper<>();
        qw.orderByDesc(HostWeb::getTimp);//根据网址添加时间升序查询
        qw.eq(HostWeb::getWebId,webName.getId());
        // 执行查询并获取最新一条数据
        return hws.getOne(qw.last("LIMIT 1"));
    }

    /**
     *
     * 获取所有 2级分组对象
     * @param webname
     * @return
     */
    public List<GroupsVideo> getListGroupsItme(WebName webname) {
    return gvs.getByWebnameId(webname.getId());
    }

public final Page<VideoMessage> pageVideoMessage(int pageNum, int pageSize){

        //vmsp.page() orderByDesc
       Page <VideoMessage> page = new Page<>(pageNum,pageSize);
    // 创建查询条件对象
    LambdaQueryWrapper<VideoMessage> qw = new LambdaQueryWrapper<>();
   // ID 字段升序
    qw.orderByDesc(VideoMessage::getId);
       return vmsp.page(page,qw);

}

    /**
     * 分页关联查询所有视频信息
     * 分组类型 分组位置 视频标题 视频简介 视频封面 视频地址 视频时长
     * 排序根据视频更新时间升序
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @return 分页结果
     */
public final Page<VideoSelect> pageAllVideoSelect(int pageNum, int pageSize){
    return vmsp.pageAll(pageNum,pageSize);
}




}
